/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
/* priest.c */
/* functions for clerics. */

#include "glob.h"

/* prayer occurs at altars, hence name of function */
void l_altar()
{
  int i,deity;
  char response;

  if (Current_Environment == E_COUNTRYSIDE) deity = DRUID;
  else deity = Level->site[Player.x][Player.y].aux;

  switch(deity) {
    default:
      print1("This rude altar has no markings.");
      break;
    case ODIN:
      print1("This granite altar is graven with a gallows.");
      break;
    case SET:
      print1("This sandstone altar has a black hand drawn on it.");
      break;
    case HECATE:
      print1("This silver altar is inlaid with a black crescent moon.");
      break;
    case ATHENA:
      print1("This golden altar is inscribed with an owl.");
      break;
    case DESTINY:
      print1("This crystal altar is in the form of an omega.");
      break;
    case DRUID:
      print1("This oaken altar is ornately engraved with leaves.");
      break;
  }
  print2("Worship at this altar? [yn] ");
  if (ynq2() == 'y') {
    if (Player.rank[PRIESTHOOD] == 0)
      increase_priest_rank(deity);
    else if (! check_sacrilege(deity)) {
      if (Blessing) print1("You have a sense of immanence.");
      print2("Request a Blessing, Sacrifice an item, or just Pray [b,s,p] ");
      do response = (char) mcigetc();
      while ((response != 'b') && 
	     (response != 's') && 
	     (response != 'p') && 
	     (response != ESCAPE));
      if (response == 'b') {
	print1("You beg a heavenly benefice.");
	print2("You hear a gong resonating throughout eternity....");
	morewait();
	if (Blessing) {
	  print1("A shaft of lucent radiance lances down from the heavens!");
	  print2("You feel uplifted....");
	  morewait();
	  gain_experience(Player.rank[PRIESTHOOD]*Player.rank[PRIESTHOOD]*50);
	  cleanse(1);
	  heal(10);
	  bless(1);
	  Blessing = FALSE;
	  increase_priest_rank(deity);
	}
	else {
	  print1("Your ardent plea is ignored.");
	  print2("You feel ashamed.");
	  Player.xp -= (Player.xp/4);
	}
	calc_melee();
      }
      else if (response == 's') {
	print1("Which item to Sacrifice?");
	i = getitem(NULL_ITEM);
	if (i==ABORT) i = 0;
	if (Player.possessions[i] == NULL) {
	  print1("You have insulted your deity!");
	  print2("Not a good idea, as it turns out...");
	  dispel(-1);
	  p_damage(Player.hp-1,UNSTOPPABLE,"a god's pique");
	}
	else if (true_item_value(Player.possessions[i]) >
		 (long) (Player.rank[PRIESTHOOD] *
		  Player.rank[PRIESTHOOD] *
		  Player.rank[PRIESTHOOD] * 50)) {
	  print1("With a burst of blue flame, your offering vanishes!");
	  dispose_lost_objects(1,Player.possessions[i]);
	  print2("A violet nimbus settles around your head and slowly fades.");
	  morewait();
	  Blessing = TRUE;
	}
	else {
	  print1("A darkling glow envelopes your offering!");
	  print2("The glow slowly fades....");
	  morewait();
	  setgamestatus(SUPPRESS_PRINTING);
	  if (Player.possessions[i]->used) {
	    Player.possessions[i]->used = FALSE;
	    item_use(Player.possessions[i]);
	    Player.possessions[i]->blessing =
	      -1 - abs(Player.possessions[i]->blessing);
	    Player.possessions[i]->used = TRUE;
	    item_use(Player.possessions[i]);
	  }
	  else Player.possessions[i]->blessing =
	    -1 - abs(Player.possessions[i]->blessing);
	  resetgamestatus(SUPPRESS_PRINTING);
	}
      }
      else if (response == 'p') {
	if (deity != Player.patron) 
	  print1("Nothing seems to happen.");
	else if (!increase_priest_rank(deity))
	  answer_prayer();
      }
    }
  }
}




int check_sacrilege(deity)
int deity;
{
  int i,sacrilege=FALSE;
  if ((Player.patron != deity) && (Player.patron > 0)) {
    sacrilege=TRUE;
    Player.pow--;
    Player.maxpow--;
    switch(Player.patron) {
    case ODIN:
      print1("Odin notices your lack of faith! ");
      morewait();
      if (deity == ATHENA) {
	print2("However, Athena intercedes on your behalf.");
	sacrilege = FALSE;
      }
      else {
	print2("You are struck by a thunderbolt!");
	p_damage(Player.level*5,UNSTOPPABLE,"Odin's wrath");
	if (Player.hp > 0) {
	  morewait();
	  print2("The bolt warps your feeble frame....");
	  Player.maxcon = Player.maxcon/2;
	  Player.con = min(Player.con,Player.maxcon);
	  Player.maxstr = Player.maxstr/2;
	  Player.con = min(Player.str,Player.maxstr);
	}
      }
      morewait();
      break;
    case SET:
      print1("Set notices your lack of faith! ");
      morewait();
      if (deity == HECATE) {
	print1("But since you pray to a friendly deity,");
	print2("Set decides not to punish you.");
	sacrilege = FALSE;
      }
      else {
	print2("You are blasted by a shaft of black fire!");
	p_damage(Player.level*5,UNSTOPPABLE,"Set's anger");
	if (Player.hp > 0) {
	  morewait();
	  print1("You are wreathed in clouds of smoke.");
	  for(i=0;i<MAXITEMS;i++) 
	    if ((Player.possessions[i] != NULL) &&
		(Player.possessions[i]->blessing > -1))
	      conform_lost_object(Player.possessions[i]);
	  morewait();
	  print2("You feel Set's Black Hand on your heart....");
	  Player.con = Player.maxcon = Player.maxcon / 4;
	}
      }
      morewait();
      break;
    case HECATE:
      print1("Hecate notices your lack of faith! ");
      morewait();
      if (deity == SET) {
	print1("But ignores the affront since she likes Set.");
	sacrilege = FALSE;
      }
      else {
	print1("You are zapped by dark moonbeams!");
	p_damage(Player.level*5,UNSTOPPABLE,"Hecate's malice");
	if (Player.hp > 0) {
	  print2("The beams leach you of magical power!");
	  Player.maxpow = Player.maxpow/5;
	  Player.pow = min(Player.pow,Player.maxpow);
	  for(i=0;i<NUMSPELLS;i++) 
	    Spells[i].known = FALSE;
	}
      }
      morewait();
      break;
    case ATHENA:
      print1("Athena notices your lack of faith! ");
      morewait();
      if (deity == ODIN) {
	print2("But lets you off this time since Odin is also Lawful.");
	sacrilege = FALSE;
      }
      else {
	print2("You are zorched by godsfire!");
	if (Player.hp > 0) {
	  morewait();
	  print1("The fire burns away your worldly experience!");
		Player.level = 0;
	  Player.xp = 0;
	  Player.maxhp = Player.hp = Player.con;
	  print2("Your power is reduced by the blast!!!");
	  Player.pow = Player.maxpow = Player.maxpow/3;
	  Player.mana = min(Player.mana,calcmana());
	}
      }
      morewait();
      break;
    case DESTINY:
      print2("The Lords of Destiny ignore your lack of faith.");
      sacrilege = FALSE;
      morewait();
      break;
    case DRUID:
      print2("Your treachery to the ArchDruid has been noted.");
      if (random_range(2) == 1)
	Player.alignment += 40;
      else Player.alignment -= 40;
      morewait();
      break;
    }
    if (sacrilege) {
      Player.patron = 0;
      Player.rank[PRIESTHOOD] = 0;
    }
  }
  return(sacrilege);
}

int increase_priest_rank(deity)
int deity;
{
  if (Player.rank[PRIESTHOOD] == 0) switch(deity) {
  default:
    print2("Some nameless god blesses you....");
    Player.hp = Player.maxhp;
    morewait();
    print2("The altar crumbles to dust and blows away.");
    Level->site[Player.x][Player.y].locchar = FLOOR;
    Level->site[Player.x][Player.y].p_locf = L_NO_OP;
    lset(Player.x, Player.y, CHANGED);
    break;
  case ODIN:
    if (Player.alignment > 0) {
      print1("Odin hears your prayer!");
      print2(Priest[ODIN]);
      nprint2(" personally blesses you.");
      nprint2(" You are now a lay devotee of Odin.");
      Player.patron = ODIN;
      Player.rank[PRIESTHOOD] = LAY;
      Player.guildxp[PRIESTHOOD] = 1;
      morewait();
      learnclericalspells(ODIN,LAY);
    }
    else print1("Odin ignores you.");
    break;
  case SET:
    if (Player.alignment < 0) {
      print1("Set hears your prayer!");
      print2(Priest[SET]);
      nprint2(" personally blesses you. ");
      nprint2(" You are now a lay devotee of Set.");
      Player.patron = SET;
      Player.rank[PRIESTHOOD] = LAY;
      Player.guildxp[PRIESTHOOD] = 1;
      morewait();
      learnclericalspells(SET,LAY);
    }
    else print1("Set ignores you.");
    break;
  case ATHENA:
    if (Player.alignment > 0) {
      print1("Athena hears your prayer!");
      print2(Priest[ATHENA]);
      nprint2(" personally blesses you.");
      nprint2(" You are now a lay devotee of Athena.");
      Player.patron = ATHENA;
      Player.rank[PRIESTHOOD] = LAY;
      Player.guildxp[PRIESTHOOD] = 1;
      morewait();
      learnclericalspells(ATHENA,LAY);
    }
    else print1("Athena ignores you.");
    break;
  case HECATE:
    if (Player.alignment < 0) {
      print1("Hecate hears your prayer!");
      print2(Priest[HECATE]);
      nprint2(" personally blesses you.");
      nprint2(" You are now a lay devotee of Hecate.");
      Player.patron = HECATE;
      Player.rank[PRIESTHOOD] = LAY;
      Player.guildxp[PRIESTHOOD] = 1;
      morewait();
      learnclericalspells(HECATE,LAY);
    }
    else print1("Hecate ignores you.");
    break;
  case DRUID:
    if (abs(Player.alignment) < 10) {
      print1(Priest[DRUID]);
      nprint1(" personally blesses you.");
      print2("You are now a lay devotee of the Druids.");
      Player.patron = DRUID;
      Player.rank[PRIESTHOOD] = LAY;
      Player.guildxp[PRIESTHOOD] = 1;
      morewait();
      learnclericalspells(DRUID,LAY);
    }
    else {
      print1("You hear a voice....");
      morewait();
      print2("'Only those who embody the Balance may become Druids.'");
    }
    break;
  case DESTINY:
    print1("The Lords of Destiny could hardly care less.");
    print2("But you can consider yourself now to be a lay devotee.");
    Player.patron = DESTINY;
    Player.rank[PRIESTHOOD] = LAY;
      Player.guildxp[PRIESTHOOD] = 1;
    break;
  }
  else if (deity == Player.patron) {
    if ((((deity == ODIN) || (deity == ATHENA)) && 
	 (Player.alignment < 1)) ||
	(((deity == SET) || (deity == HECATE)) && 
	 (Player.alignment > 1)) ||
	((deity == DRUID) && (abs(Player.alignment) > 10))) {
      print1("You have swerved from the One True Path!");
      print2("Your deity is greatly displeased...");
      Player.xp -= Player.level*Player.level;
      Player.xp = max(0,Player.xp);
    }
    else if (Player.rank[PRIESTHOOD]== HIGHPRIEST) return 0;
    else if (Player.rank[PRIESTHOOD]== SPRIEST) {
      if (Player.level > Priestlevel[deity])
	hp_req_test();
      else return 0;
    }
    else if (Player.rank[PRIESTHOOD]==PRIEST) {
      if (Player.guildxp[PRIESTHOOD] >= 4000) {
	print1("An heavenly fanfare surrounds you!");
	print2("Your deity raises you to the post of Senior Priest.");
	hp_req_print();
	Player.rank[PRIESTHOOD] = SPRIEST;
      }
      else return 0;
    }
    else if (Player.rank[PRIESTHOOD]==ACOLYTE) {
      if (Player.guildxp[PRIESTHOOD] >= 1500) {
	print1("A trumpet sounds in the distance.");
	print2("Your deity raises you to the post of Priest.");
	Player.rank[PRIESTHOOD] = PRIEST;
	morewait();
	learnclericalspells(deity,PRIEST);
      }
      else return 0;
    }
    else if (Player.rank[PRIESTHOOD]==LAY) {
      if (Player.guildxp[PRIESTHOOD] >= 400) {
	print1("A mellifluous chime sounds from above the altar.");
	print2("Your deity raises you to the post of Acolyte.");
	Player.rank[PRIESTHOOD] = ACOLYTE;
	morewait();
	learnclericalspells(deity,ACOLYTE);
      }
      else return 0;
    }
  }
  return 1;
}


void answer_prayer()
{
  clearmsg();
  switch(random_range(12)) {
  case 0: print1("You have a revelation!"); break;
  case 1: print1("You feel pious."); break;
  case 2: print1("A feeling of sanctity comes over you."); break;
  default: print1("Nothing unusual seems to happen."); break;
  }
}


void hp_req_test()
{
  pob o;
  switch  (Player.patron) {
  case ODIN:
    if (find_item(&o,ARTIFACTID+15,-1))
      make_hp(o);
    else hp_req_print();
    break;
  case SET:
    if (find_item(&o,ARTIFACTID+14,-1))
      make_hp(o);
    else hp_req_print();
    break;
  case ATHENA:
    if (find_item(&o,ARTIFACTID+17,-1))
      make_hp(o);
    else hp_req_print();
    break;
  case HECATE:
    if (find_item(&o,ARTIFACTID+16,-1))
      make_hp(o);
    else hp_req_print();
    break;
  case DRUID:
    if (find_item(&o,ARTIFACTID+14,-1))
      make_hp(o);
    else if (find_item(&o,ARTIFACTID+15,-1))
      make_hp(o);
    else if (find_item(&o,ARTIFACTID+16,-1))
      make_hp(o);
    else if (find_item(&o,ARTIFACTID+17,-1))
      make_hp(o);
    else hp_req_print();
    break;
  case DESTINY:
    if (find_item(&o,ARTIFACTID+19,-1))
      make_hp(o);
    else hp_req_print();
    break;
  }
}


void hp_req_print()
{
  morewait();
  print1("To advance further, you must obtain the Holy Symbol of ");
  switch(Player.patron) {
  case ODIN:
    nprint1(Priest[SET]);
    print2("who may be found in the main Temple of Set.");
    break;
  case SET:
    nprint1(Priest[ODIN]);
    print2("who may be found in the main Temple of Odin.");
    break;
  case ATHENA:
    nprint1(Priest[HECATE]);
    print2("who may be found in the main Temple of Hecate.");
    break;
  case HECATE:
    nprint1(Priest[ATHENA]);
    print2("who may be found in the main Temple of Athena.");
    break;
  case DRUID:
    print2("any of the aligned priests who may be found in their main Temples.");
    break;
  case DESTINY:
    nprint1(Priest[DESTINY]);
    print2("who may be found in the main Temple of Destiny.");
    break;
  }
}

void make_hp(o)
pob o;
{
  print1("A full-scale heavenly choir chants 'Hallelujah' all around you!");
  print2("You notice a change in the symbol you carry....");
  switch(Player.patron) {
  case ODIN:
    *o = Objects[ARTIFACTID+14];
    break;
  case SET:
    *o = Objects[ARTIFACTID+15];
    break;
  case ATHENA:
    *o = Objects[ARTIFACTID+16];
    break;
  case HECATE:
    *o = Objects[ARTIFACTID+17];
    break;
  case DRUID:
    *o = Objects[ARTIFACTID+18];
    break;
  case DESTINY:
    *o = Objects[ARTIFACTID+19];
    break;
  }
  o->known = 2;
  o->charge = 17; /* random hack to convey bit that symbol is functional */
  morewait();
  if (Player.patron == DRUID)
    print1("Your deity raises you to the post of ArchDruid!");
  else print1("Your deity raises you to the post of High Priest!");
  print2("You feel holy.");
  strcpy(Priest[Player.patron],Player.name);
  Priestlevel[Player.patron] = Player.level;
  Player.rank[PRIESTHOOD] = HIGHPRIEST;
  morewait();
  Priestbehavior[Player.patron] = fixnpc(4);
  save_hiscore_npc(Player.patron);
  learnclericalspells(Player.patron,HIGHPRIEST);
}
